package com.zeny.express.framework.webapp.action;

import java.util.HashMap;
import java.util.Map;

import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.MessageSource;

import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.ActionSupport;
import com.zeny.express.framework.config.ConfigurationService;
import com.zeny.express.framework.shared.domain.User;
import com.zeny.express.framework.shared.exception.ApplicationException;
import com.zeny.express.framework.webapp.context.UserContext;

/**
 * Action基础类
 * 
 * @author zhuwei
 * @date 2013年8月20日 上午10:56:10
 */
@SuppressWarnings("serial")
public abstract class BaseAction extends ActionSupport {

	/**
	 * 返回结果：失败的tiles页面
	 */
	public static final String ERROR_TILES = "error_tiles";

	/**
	 * 返回结果：失败的jsp页面
	 */
	public static final String ERROR_JSP = "error_jsp";

	/**
	 * 返回结果：失败的json数据
	 */
	public static final String ERROR_JSON = "error_json";

	/**
	 * 返回结果：同步导出
	 */
	public static final String SYNC_EXPORT = "sync_export";

	/**
	 * 返回结果：同步导出
	 */
	public static final String ASYNC_EXPORT = "async_export";

	/**
	 * AJAX消息
	 */
	private static final String MESSAGE = "message";

	/**
	 * 统一日志
	 */
	protected final Logger LOGGER = LoggerFactory.getLogger(getClass());

	/**
	 * 国际化消息
	 */
	@Autowired
	protected MessageSource messageSource;

	/**
	 * 参数配置
	 */
	@Autowired
	protected ConfigurationService configurationService;

	/**
	 * AJAX 返回值
	 * {success:true/false, message: xxx, ...}
	 */
	protected Map<String, Object> result = new HashMap<String, Object>();

	/**
	 * 默认构造函数； 注意：spring prototype bean 不会destroy
	 * 
	 * @author zhuwei
	 * @date 2013年8月29日 下午2:39:43
	 */
	public BaseAction() {
		LOGGER.debug("Construct action bean: " + getClass());
	}

	/**
	 * 执行前预处理
	 * 
	 * @author zhuwei
	 * @date 2013年8月28日 上午11:39:16
	 * @param invocation
	 */
	public void beforeInvoke(ActionInvocation invocation) {
		
		LOGGER.debug("beforeInvoke");
	}

	/**
	 * 执行后再处理
	 * 
	 * @author zhuwei
	 * @date 2013年8月28日 上午11:39:43
	 * @param invocation
	 */
	public void afterInvoke(ActionInvocation invocation) {

		LOGGER.debug("afterInvoke");
		
	}

	/**
	 * 国际化异常类信息
	 * 
	 * @author zhuwei
	 * @date 2013年8月20日 上午11:29:48
	 * @param e
	 */
	public void addActionError(ApplicationException e) {

		String errorMessage = null;
		if (StringUtils.isEmpty(e.getErrorCode())) {
			errorMessage = e.getMessage();
		} else {
			errorMessage = messageSource.getMessage(e.getErrorCode(),
					e.getArgs(), e.getErrorCode(), getLocale());
		}

		addActionError(errorMessage);

	}

	/**
	 * AJAX RESULT 设置  ajaxResults result和message
	 * @return result
	 */
	public Map<String, Object> getResult() {
		
		StringBuilder message = new StringBuilder();
		
		if (hasActionErrors()) {
			result.put(SUCCESS, false);
			for (String error : getActionErrors()) {
				message.append(error);
			}
		} else {
			result.put(SUCCESS, true);
		}
		
		if (hasActionMessages()) {
			for (String msg : getActionMessages()) {
				message.append(msg);
			}
		}

		result.put(MESSAGE, message.toString());
		
		return result;
	}

	/**
	 * 返回当前 用户信息
	 * 
	 * @author zhuwei
	 * @date 2013年8月28日 上午10:24:51
	 */
	public User getCurrentUser() {
		return UserContext.getCurrentUser();
	}

	/**
	 * TODO 返回用户菜单
	 * 
	 * @author zhuwei
	 * @date 2013年8月28日 上午10:24:51
	 */
	public void getUserMenus() {

	}

}
